package com.zuipin.util;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

/**
  * 通用工具类
  * @ClassName: CommonUtils
  * @Description: TODO
  * @author joy.zhang
  * @date 2017年3月29日 下午5:08:13
  *
 */
public class CommonUtils {
	/**
	 *   将带下划线风格字符串转成驼峰格式
	  *  @Title: toCamelCase
	  * @author joy.zhang
	  * @date 2017年3月29日 下午5:23:56
	  * @param name
	  * @return
	  * @return String
	 */
	public static String toCamelCase(String columnName) {
		String str = null;
		if (columnName != null) {
			if (columnName.contains("_")) {
				String[] words = columnName.split("_");
				for (int i = 0; i < words.length; i++) {
					if (i > 0) {
						str += words[i].substring(0, 1).toUpperCase()
								+ words[i].substring(1).toLowerCase();
					} else {
						str = words[i].toLowerCase();
					}
				}
			} else {
				str = columnName.toLowerCase();
			}
		}
		return str;
	}
	
	private static Map<String, String> fieldMap = null;
	
	public static String getCodeType(String columnType) {
		String codeType = null;
		if (fieldMap == null) {
			fieldMap = new HashMap<String, String>();
			fieldMap.put("int", "Integer");
			fieldMap.put("double", "BigDecimal");
			fieldMap.put("decimal", "BigDecimal");
			fieldMap.put("tinyint", "Integer");
			fieldMap.put("bigint", "Long");
			fieldMap.put("char", "String");
			fieldMap.put("varchar", "String");
			fieldMap.put("varchar", "String");
			fieldMap.put("timestamp", "String");
		}
		if (columnType != null) {
			codeType = fieldMap.get(columnType.toLowerCase());
		}
		//default
		if (codeType == null) {
			codeType = "String";
		}
		return codeType;
		
	}
	
	/**
	 * 根据属性获得首字母大写的方法名
	  *  @Title: getMethodName
	  * @author joy.zhang
	  * @date 2017年3月30日 上午10:49:30
	  * @param proName
	  * @return
	  * @return String
	 */
	public static String getUpFirstName(String proName) {
		String methodName = proName;
		if (proName != null) {
			if (proName.length() > 1) {
				methodName = proName.substring(0, 1).toUpperCase() + proName.substring(1);
			} else {
				methodName = proName.toUpperCase();
			}
			
		}
		return methodName;
	}
	
	/**
	 * 首字母小写
	  *  @Title: getLowFirstName
	  * @author joy.zhang
	  * @date 2017年3月31日 下午2:03:48
	  * @param proName
	  * @return
	  * @return String
	 */
	public static String getLowFirstName(String proName) {
		String methodName = proName;
		if (proName != null) {
			if (proName.length() > 1) {
				methodName = proName.substring(0, 1).toLowerCase() + proName.substring(1);
			} else {
				methodName = proName.toUpperCase();
			}
			
		}
		return methodName;
	}
	
	/**
	 * 获取客户端真实ip地址
	 * 
	 * @author: Santy
	 * @date: 2015年9月10日
	 * @return
	 */
	public static String getIpAddr(HttpServletRequest request) throws Exception {
		boolean b = false;
		String ip = request.getHeader("x-forwarded-for");
		if (StringUtil.isNotBlank(ip) && !"unKnown".equalsIgnoreCase(ip)) {
			// 多次反向代理后会有多个ip值，第一个ip才是真实ip
			int index = ip.indexOf(",");
			if (index != -1) {
				ip = ip.substring(0, index);
				b = isRealIPAddr(ip);
				if (!b) {
					ip = "";
				}
			}
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("X-Real-IP");
			if (StringUtil.isNotBlank(ip)) {
				b = isRealIPAddr(ip);
				if (!b) {
					ip = "";
				}
			}
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("Proxy-Client-IP");
			if (StringUtil.isNotBlank(ip)) {
				b = isRealIPAddr(ip);
				if (!b) {
					ip = "";
				}
			}
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getHeader("WL-Proxy-Client-IP");
			if (StringUtil.isNotBlank(ip)) {
				b = isRealIPAddr(ip);
				if (!b) {
					ip = "";
				}
			}
		}
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			ip = request.getRemoteAddr();
		}
		return ip;
	}
	
	/**
	 * 真实IP地址验证， 防止IP攻击，错误的IP导致安全问题
	 * 
	 * @author: Santy
	 * @date: 2015年9月11日
	 * @param ipAddr
	 * @return
	 * @throws Exception
	 */
	private static boolean isRealIPAddr(String ipAddr) throws Exception {
		boolean b1 = false;
		String spIP1 = "0.0.0.0";
		String spIp2 = "255.255.255.255";
		// 是否正确的ip地址
		boolean b = RegexUtils.Regular(ipAddr, RegexUtils.IP);
		if (b) {
			if (!spIP1.equals(ipAddr) && !spIp2.equals(ipAddr)) {
				b1 = true;
			}
		}
		return b1;
	}
	
	/**
	 * 建立请求，以表单HTML形式构造（默认）
	 * 
	 * @param sParaTemp 请求参数数组
	 * @param strMethod 提交方式。两个值可选：post、get
	 * @param strButtonName 确认按钮显示文字
	 * @return 提交表单HTML文本
	 * @throws UnsupportedEncodingException 
	 * @throws NoSuchAlgorithmException 
	 */
	public static String buildRequestHtml(Map<String, String> sParaTemp, String strMethod,
			String strButtonName, String payUrl) {
		// 待请求参数数组
		List<String> keys = new ArrayList<String>(sParaTemp.keySet());
		StringBuffer sbHtml = new StringBuffer();
		
		sbHtml.append("<form id=\"qksubmit\" name=\"qksubmit\" action=\"" + payUrl + "\" method=\""
				+ strMethod + "\">");
		
		for (int i = 0; i < keys.size(); i++) {
			String name = (String) keys.get(i);
			String value = (String) sParaTemp.get(name);
			sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
		}
		
		// submit按钮控件请不要含有name属性
		sbHtml.append("<input type=\"submit\" value=\"" + strButtonName
				+ "\" style=\"display:none;\"></form>");
		sbHtml.append("<script>document.forms['qksubmit'].submit();</script>");
		
		return sbHtml.toString();
	}
	
	/**
	 * @Description:根据符号分割
	 * @Title:
	 * @author: xujinding
	 * @date: 2017年3月24日下午2:58:05
	 */
	public static String[] splitBySymbol(String srcStr, String symbol) {
		if (srcStr != null && !"".equals(srcStr) && symbol != null && !"".equals(symbol)) {
			String[] str = srcStr.split(symbol);
			return str;
		}
		return null;
	}
	
	/**
	 * @Description: 通过JVM的UUID产生，并取出-
	 * @Title:
	 * @author: xujinding
	 * @date: 2017年3月24日下午2:58:05
	 */
	public static String getUUID() {
		String uuid = UUID.randomUUID().toString();
		StringBuilder sb = new StringBuilder(32);
		sb.append(uuid.substring(0, 8));
		sb.append(uuid.substring(14, 18));
		sb.append(uuid.substring(19, 23));
		sb.append(uuid.substring(24));
		return sb.toString();
	}
}
